package cn.mesmile.thread;

/**
 * @author zb
 * @date 2020/12/27 22:36
 * @Description:
 */
public class ThreadDemo {

    /**
     * 1.创建一个集成于Thread类的子类 （通过ctrl+o（override）输入run查找run方法）
     * 2.重写Thread类的run（）方法
     * 3.创建Thread子类的对象
     * 4.通过此对象调用start（）方法
     * <p>
     * start与run方法的区别：
     * start方法的作用：
     * 1.启动当前线程
     * 2.调用当前线程的重写的run方法（在主线程中生成子线程，有两条线程）
     * 调用start方法以后，一条路径代表一个线程，同时执行两线程时，因为时间片的轮换，所以执行过程随机分配，
     * 且一个线程对象只能调用一次start方法。
     * run方法的作用：在主线程中调用以后，直接在主线程一条线程中执行了该线程中run的方法。
     * （调用线程中的run方法，只调用run方法，并不新开线程）
     * <p>
     * 总结：我们不能通过run方法来新开一个线程，只能调用线程中重写的run方法（可以在线程中不断的调用run方法，但是不能开启子线程，即不能同时干几件事），
     * start是开启线程，再调用方法（即默认开启一次线程，调用一次run方法，可以同时执行几件事）
     */


    /**
     *  //获取当前线程的名字
     * Thread.currentThread().getName()
     *
     * 1.start():1.启动当前线程2.调用线程中的run方法
     * 2.run():通常需要重写Thread类中的此方法，将创建的线程要执行的操作声明在此方法中
     * 3.currentThread():静态方法，返回执行当前代码的线程
     * 4.getName():获取当前线程的名字
     * 5.setName():设置当前线程的名字
     * 6.yield():主动释放当前线程的执行权
     * 7.join():在线程中插入执行另一个线程，该线程被阻塞，直到插入执行的线程完全执行完毕以后，
     * 该线程才继续执行下去
     * 8.stop():过时方法。当执行此方法时，强制结束当前线程。
     * 9.sleep（long millitime）：线程休眠一段时间
     * 10.isAlive（）：判断当前线程是否存活
     */

    public static void main(String[] args) {
        Window t1 = new Window();
        Window t2 = new Window();
        Window t3 = new Window();

        t1.setName("售票口1");
        t2.setName("售票口2");
        t3.setName("售票口3");
        // start 的方式启动，是非并发的,start是开启线程，再调用方法;一条路径代表一个线程
        t1.start();
        t2.start();
        t3.start();
        // 获取线程的优先级
        /*
         *  时间片：线程的调度采用时间片轮转的方式
         *  抢占式：高优先级的线程抢占CPU
         *      从概率上来说的，高优先级的线程更有可能被执行。
         *      并不意味着只有高优先级的线程执行完以后，低优先级的线程才执行
         *  最大优先级为 10
         *  最小优先级为 1
         *  默认优先级为 5
         */
        int priority = t1.getPriority();
        System.out.println("priority = " + priority);
        try {
            /*
                在该线程中插入执行另外一个线程，该线程被阻塞，
                直到插入执行的线程完全执行完毕以后，该线程才会继续执行下去
             */
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    }

}


class Window extends Thread {
    //将其加载在类的静态区，所有线程共享该静态变量
    private static int ticket = 100;

    @Override
    public void run() {
        while (true) {
            synchronized (Window.class) {
                if (ticket > 0) {
                    try {
                        sleep(100L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + "当前售出第" + ticket + "张票");
                    ticket--;
                } else {
                    break;
                }
            }
        }
    }

}